package jwdt.utils;

import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Enumeration;
import java.util.Properties;

public class TypeResolver {

	private static final Properties typeMap = new Properties();

	static {
		typeMap.setProperty("float", "Float");
		typeMap.setProperty("float unsigned zerofill", "Float");
		typeMap.setProperty("double", "Double");
		typeMap.setProperty("decimal", BigDecimal.class.getName());
		typeMap.setProperty("money", BigDecimal.class.getName());
		typeMap.setProperty("currency", BigDecimal.class.getName());
		typeMap.setProperty("int", "Integer");
		typeMap.setProperty("uniqueidentifier", "Integer");
		typeMap.setProperty("nvarchar", "String");
		typeMap.setProperty("tinyint", "Byte");
		typeMap.setProperty("smallint", "Short");
		typeMap.setProperty("mediumint", "Integer");
		typeMap.setProperty("int2", "Integer");
		typeMap.setProperty("int4", "Long");
		typeMap.setProperty("int8", "Long");
		typeMap.setProperty("integer", "Integer");
		typeMap.setProperty("int identity", "Integer");
		typeMap.setProperty("bigint", "Long");
		typeMap.setProperty("numeric", "Integer");
		typeMap.setProperty("number", "Integer");
		typeMap.setProperty("serial", "Integer");
		typeMap.setProperty("int unsigned", "Integer");
		typeMap.setProperty("smallint", "Short");
		typeMap.setProperty("mediumint", "Integer");
		typeMap.setProperty("datetime", Timestamp.class.getName());
		typeMap.setProperty("timestamp", Timestamp.class.getName());
		typeMap.setProperty("timestamptz", Timestamp.class.getName());
		typeMap.setProperty("typesystimestamp", Timestamp.class.getName());
		typeMap.setProperty("smalldatetime", Date.class.getName());
		typeMap.setProperty("interval", Timestamp.class.getName());
		typeMap.setProperty("time", Time.class.getName());
		typeMap.setProperty("date", Date.class.getName());
		typeMap.setProperty("smalldate", Date.class.getName());
		typeMap.setProperty("ntext", "String");
		typeMap.setProperty("text", "String");
		typeMap.setProperty("mediumtext", "String");
		typeMap.setProperty("mediumblob", "Byte");
		typeMap.setProperty("longtext", "String");
		typeMap.setProperty("varchar", "String");
		typeMap.setProperty("varchar2", "String");
		typeMap.setProperty("char", "String");
		typeMap.setProperty("bpchar", "String");
		typeMap.setProperty("clob", "String");
		typeMap.setProperty("blob", "Byte");
		typeMap.setProperty("bit", "Boolean");
		typeMap.setProperty("bool", "Boolean");
		typeMap.setProperty("varbinary", "Byte");
		typeMap.setProperty("image", "Byte");
		typeMap.setProperty("byte", "Byte");
	}
	
	public static String resolveType (String type, boolean useDefault) {
		if (null == type) return null;
		String s = typeMap.getProperty(type.toLowerCase());
		if (null == s) {
			if (useDefault) return String.class.getName();
			else {
				for (Enumeration e=typeMap.keys(); e.hasMoreElements(); ) {
					String key = e.nextElement().toString();
					if (type.toLowerCase().startsWith(key.toLowerCase()))
						return typeMap.getProperty(key);
				}
				return null;
			}
		}
		else {
			return s;
		}
	}
}
